Dotaz na hodnotu generaotru
Otázka od: Petr Fejfar
17. 9. 2002 15:30
From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
> select gen_id(mygenerator, 1) from rdb$database
Hi,
nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01 pripojene pres
TIB componenty.
Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi vrati spravnou
hodnotu, ale jakmile ten samy text prikazu spustim v TIBQuery.ExecSQL, tak
dostanu chybu:
Invalid request BLR at offset 75,
generator XXXXXXX is not defined.
Muze mi pls nekdo poradit, co s tim mam udelat,
aby to fungovalo popr. jiny zpusob,
jak dostat hodnotu primarniho klice generovaneho
napr. generatorem+triggerem do klientske aplikace
- neco jako LastInsertRowID?
Thx, pf
Odpovedá: Ondrej Kelle
17. 9. 2002 15:07
>> select gen_id(mygenerator, 1) from rdb$database
>>
> nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01
> pripojene pres TIB componenty.
>
> Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi
> vrati spravnou hodnotu, ale jakmile ten samy text prikazu
> spustim v TIBQuery.ExecSQL, tak dostanu chybu:
>
> Invalid request BLR at offset 75,
> generator XXXXXXX is not defined.
Myslim, ze namiesto ExecSQL potrebujes zavolat Open, pretoze SELECT ...
statement vracia result set (v tomto pripade len jeden riadok).
S IBX som to neskusal, pouzivam IBObjects (TIB_Cursor) a tam to funguje:
function GetNextGenID(IB_Connection: TIB_Connection; const Generator:
string): Integer;
var
IB_Cursor: TIB_Cursor;
begin
Result := -1;
IB_Cursor := TIB_Cursor.Create(nil);
try
IB_Cursor.IB_Connection := IB_Connection;
IB_Cursor.IB_Transaction := IB_Connection.DefaultTransaction;
IB_Cursor.SQL.Text := Format('SELECT GEN_ID(%s, 1) FROM RDB$DATABASE',
[Generator]);
IB_Cursor.Open;
if not IB_Cursor.EOF then
Result := IB_Cursor.Fields[0].AsInteger;
finally
IB_Cursor.Free;
end;
end;
HTH
TOndrej
Odpovedá: Ben, Martin (CAP, GCF)
17. 9. 2002 16:23
A co misto TIBQuery.ExecSQL zkusit TIBQuery.Open
Martin Ben
> -----Original Message-----
> From: Petr Fejfar [mailto:development@callnet.cz]
>
> From: "Ondrej Kelle" <O.Kelle@digitalpublishing.de>
>
> > select gen_id(mygenerator, 1) from rdb$database
>
>
> Hi,
>
> nejak nemuzu rozchodit uvedeny select z D6prof proti IB6.01
> pripojene pres
> TIB componenty.
>
> Kdyz ho zadam rucne v IB Consoli nebo v DB Exploreru, tak mi
> vrati spravnou
> hodnotu, ale jakmile ten samy text prikazu spustim v
> TIBQuery.ExecSQL, tak
> dostanu chybu:
>
> Invalid request BLR at offset 75,
> generator XXXXXXX is not defined.
>
Odpovedá: Petr Fejfar
17. 9. 2002 14:11
<Martin.Ben@GECAPITAL.com>
> A co misto TIBQuery.ExecSQL zkusit TIBQuery.Open
Sorry, jen jsem se do mailu upsal
- samozrejme ze volam Open().
Bye, pf
Odpovedá: Jan Sebelík
18. 9. 2002 8:52
> Odesílatel: Petr Fejfar <development@callnet.cz>
> > select gen_id(mygenerator, 1) from rdb$database
Ja bych z Delphi spise zavolal ulozenou proceduru, ktera mi hodnotu generatoru
vrati.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
Odpovedá: Petr Fejfar
18. 9. 2002 19:54
From: "Jan Sebelík" <honza@haes.cz>
> Ja bych z Delphi spise zavolal ulozenou proceduru,
> ktera mi hodnotu generatoru vrati.
Jaky v tom spatrujes prinos?
Me napada jen urcita nezavislost Delphi kodu
na DB stroji, ale tak je specialne u SQL serveru problematicka...
Bye, pf
Odpovedá: Roman
19. 9. 2002 6:32
> From: "Jan Sebelík" <honza@haes.cz>
>
> > Ja bych z Delphi spise zavolal ulozenou proceduru,
> > ktera mi hodnotu generatoru vrati.
>
> Jaky v tom spatrujes prinos?
>
> Me napada jen urcita nezavislost Delphi kodu
> na DB stroji, ale tak je specialne u SQL serveru problematicka...
No neco jako:
procedure VlozZaznam
( pole1...,pole2...,pole3...)
returns
(id...)
as
begin
id=gen_id(generator,1)
insert into values (:id,:pole1,...)
end
Spravne ID ziskas hned.
Nejsou nahodou generatory mimo transakcni kontrolu? Co kdyz nez das ten
"select gen_id()" nekdo dalsi provede insert...
Roman
==============================
http://kouzelne.misto.cz
Odpovedá: Petr Fejfar
19. 9. 2002 15:47
From: "Roman" <sw.maurice@seznam.cz>
> Nejsou nahodou generatory mimo transakcni kontrolu?
> Co kdyz nez das ten
> "select gen_id()" nekdo dalsi provede insert...
No a?
Dulezite je, aby funkce gen_id() byla implementovana jako thread safe tj.
jako neprerusitelna tj. aby inkrement hodnoty byl v kriticke sekci a to
doufam je, i kdyz u tech databazistu jeden nikdy nevi
Pak zadne dva procesy nemohou ziskat stejnou hodnotu (samozrejme neuvazu
pripad gen_id(xxxx,0))
Bye, pf
Odpovedá: Jan Sebelík
19. 9. 2002 9:52
> Odesílatel: Roman <sw.maurice@seznam.cz>
> > Ja bych z Delphi spise zavolal ulozenou proceduru,
> > ktera mi hodnotu generatoru vrati.
> Jaky v tom spatrujes prinos?
Nepotrebuju vedet, co to je rdb$database (nebo co).
Nejsou nahodou generatory mimo transakcni kontrolu? Co kdyz nez das ten
"select gen_id()" nekdo dalsi provede insert...
Generatory jsou mimo transakcni kontrolu.
Jinymi slovy, rollback nevrati hodnotu generatoru zpet.
Jakkoli jsem vyse psal, ze bych preferoval ulozenou proceduru, domnivam se, ze
i "soucasne" zavolany select gen_id(...) vrati ruzne hodnoty ID.
Honza
=========================================
= HAES - RNDr. Jan Sebelik
= http://www.haes.cz
= Skolici a konzultacni stredisko pro Delphi a Win32
= Vojtiskova 206
= 507 81 Lazne Belohrad
= tel. 0434 692 569 (0776 347735)
=========================================
Odpovedá: Petr Fejfar
19. 9. 2002 10:59
From: "Jan Sebelík" <honza@haes.cz>
> Nepotrebuju vedet, co to je rdb$database (nebo co).
Je pravda, ze aby to vygenerovalo jedinou hodnotu,
tak se u toho selectu musi zajistit, aby tabulka obsahovala prave jeden
zaznam. A u IB je takovou tabulkou RDB$DATABASE - teda pokud do ni nekdo
nevlozi neco dalsiho
***
Me se to taky moc nelibi, ale IMHO se to v bordelu,
ktery ve svete SQL serveru panuje, docela ztrati
pf
Odpovedá: Roland Turcan
19. 9. 2002 13:13
<<< 19. 9. 2002 10:01 - "Jan Sebelík" "honza@haes.cz" >>>
>> Odesílatel: Petr Fejfar <development@callnet.cz>
>> > select gen_id(mygenerator, 1) from rdb$database
JS> Ja bych z Delphi spise zavolal ulozenou proceduru, ktera mi hodnotu
generatoru vrati.
Ale aby som si na kazdy generator vytvaral SP to predsa nie je to
prave orechove. Ale som nepochopil co tym myslis.
--
Best regards, TRoland
http://www.rotursoft.sk